//struct myStack
//{
//	int* p_min;
//	int m_size;
//	int* p_tail;
//	void pop()
//	{
//		p_tail --;
//		m_size --;
//		if (*p_tail == *p_min)
//		{
//			p_min --;
//		}
//		//min
//	}
//
//	void push(int data)
//	{
//		p_tail ++;
//		*p_tail = data;
//
//		if (*p_min > data)
//		{
//			p_min ++;
//			*p_min = data;
//		}
//
//		m_size ++;
//	}
//
//	int min()
//	{
//		return *p_min;
//	}
//};
//
//int main()
//{
//	myStack* stack;
//	stack = new myStack();
//	stack->m_size = 0;
//	stack->
//
//	int array[] = {10, 8, 6, 9, 14, 12, 16};
//	for (int i = 0; i < 7; ++ i)
//	{
//		stack.push(array[i]);	
//	}
//
//	return 0;
//}

#include <vector>
#include <iostream>
#include <assert.h>
using namespace std;

#define POPTIME		2

struct elementData
{
	int num;
	int min;
};

struct myStack
{
	vector <elementData> element;
	int min;
	
	void pop()
	{
		assert(!element.empty());
		element.pop_back();
		if (!element.empty())
		{
			min = element.back().min;
		}
		else
		{
			min = 0;
			cout<< "there is no element in stack!" <<endl;
		}
	}

	void push(int num)
	{
		if (element.empty())
		{
			min = num;
		}

		elementData data;
		data.num = num;
		
		if (min < num)
		{
			data.min = min;
		}
		else
		{
			data.min = num;
			min = num;
		}

		element.push_back(data);
	}

	int GetMin()
	{
		return min;
	}
};

int main()
{
	myStack stack;
	
	int array[] = {10, 8, 1, 5};
	for (int i = 0; i < sizeof(array) /sizeof(int); ++ i)
	{
		stack.push(array[i]);	
	}

	for (int j = 0; j < POPTIME; ++ j)
	{
		stack.pop();
	}

	cout<< stack.GetMin() << endl;
	system("pause");
	return 0;
}